# -*- coding: utf-8 -*-
"""
Created on Tue May  1 20:51:38 2018

@author: Yang Ge
"""


# 导入numpy
import numpy as np

# Numpy 的运算单位 数组

# 创建N-dimensional array(ndarray)
# Numpy 构造函数
# numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
# object：任何暴露数组接口的对象
# dtype : 数组所需的数据类型，optional
# copy : 对象是否被复制，optional
# order : 排序方式，{‘K’, ‘A’, ‘C’, ‘F’}
# ndmin : 指定返回数组的最小维度

# 返回值
# ndarray是数组对象，有两部分组成：
# 实际数据
# 描述这些数据的元数据（维度、类型）


# 创建一维数组 ndarray
a = np.array([1,2,3]) # 一般要求所有元素类型相同（同质）
type(a)
print(a) # [1,2,3]
print(a[0]) # 下标从0开始
print(a.dtype) # int32默认
print(type(a)) # <class 'numpy.ndarray'>

# ndarray 属性：ndim/shape/size/dtype/itemsize
# 创建 2*3 ndarray
array = np.array([[1,2,3], [3,4,5]])

# ndarray.ndim
print(array.ndim)  # 2

# ndarray.shape
print(array)
print(array.shape) # (2, 3)

# 变换array的形状
array.shape = (3,2)
print(array)

# ndarray.size 元素个数
print(array.size) # ndarray中元素的个数，n*m

# ndarray.dtype 元素的类型
print(array.dtype) # 默认int32

# ndarray.itemsize
# 返回数组中每个元素的大小，字节为单位
print(array.itemsize) # 4



import numpy as np

# Numpy 切片和索引
# 索引：获取数组中特定位置的元素
# 切片：获取数组元素子集
# array[a:b]，表示提取array [a,b)范围数据
# array[a:]，表示提取[a,end]范围的数据
# 三种索引方法类型：字段访问、基本切片、高级切片
a = np.arange(10)
print(a)
print(a[5]) # 索引
print(a[2:6:1]) # 切片
print(a[2:])


# 多维数组
b = np.arange(24)
reshaped_b = b.reshape((2,3,4))
print(reshaped_b)
print("reshape b ndim:", reshaped_b.ndim)

# 索引，每个维度一个索引值，逗号分隔
print(b[1,2,3])
# 切片
print(b[:,1, 2])
print(b[:,1]) # 省略某维为全取
print(b[:,:,::2]) # 步长跳跃切片


# 高级索引（不常用）
# 高级索引始终返回数据的副本
# 两类高级索引：整数、布尔值
# 整数索引

# 布尔索引
a = np.array([[1,2,3], [2,3,4], [3,4,5]])
print(a)
print(a[ a > 3])

nanArray = np.array([np.nan, 1, 2, np.nan,3, 4])
print(nanArray)
print(nanArray[~np.isnan(nanArray)])


# 小结：
# numpy的核心对象：ndarray（N-dimensional array）
# 创建ndarray：ndarray = np.array(构造参数)
# ndarray的常用属性：ndim/shape/size/dtype/itemsize
# ndarray的访问：索引[index]、切分[a:b]


 
